package org.artifact.core.context.session;

import org.artifact.core.context.packet.NetworkPacket;

import java.net.SocketAddress;

public interface Session {
    /**
     * SessionID
     * @return
     */
    String getId();

    /**
     * 获得本地IP
     *
     * @return
     */
    SocketAddress localAddress();

    /**
     * 获得远程IP
     *
     * @return
     */
    SocketAddress remoteAddress();

    /**
     * 关闭
     */
    void close();

    /**
     * 是否打开
     * @return
     */
    boolean isOpen();

    /**
     * 是否活跃
     * @return
     */
    boolean isActive();

    /**
     * 是否能写数据
     * @return
     */
    boolean isWritable();

    /**
     * Session属性
     * @param key
     * @param <T>
     * @return
     */
    <T> SessionAttr<T> attr(SessionAttrKey<T> key);
    /**
     * 发送网络包
     * @param packet
     */
    void send(NetworkPacket packet);

    /**
     * 发送后关闭
     * @param packet
     */
    void sendAndClose(NetworkPacket packet);
    
    /**
     * 发送网络包
     * @param data
     */
    void send(byte[] data);

    /**
     * 发送后关闭
     * @param data
     */
    void sendAndClose(byte[] data);

    /**
     * 接收网络包
     * @param packet
     */
    void receive(NetworkPacket packet);




    static enum State {
        /**
         * 随便什么状态都可以访问.
         * <p>
         * 状态比较特殊，比如心跳
         */
        ALL,
        /**
         * 客户端刚刚链接上来的状态.
         * <p>
         * 未登录才可以调用的方法
         */
        CONNECTED,
        /**
         * 已认证状态.
         * <p>
         * 已登录但未进游戏（可能有选角界面）
         */
        AUTHENTICATED,
        /**
         * 游戏中状态，选择角色进入游戏了.
         */
        INGAME;
    }
}
